#include <bits/stdc++.h>
using namespace std;
struct control {
    int ct, val;
    control(int Ct, int Val = -1)
        : ct(Ct)
        , val(Val)
    {
    }
    inline control operator()(int Val)
    {
        return control(ct, Val);
    }
} _endl(0), _prs(1), _setprecision(2);
struct FastIO {
#define IOSIZE 1000000
    char in[IOSIZE], *p, *pp, out[IOSIZE], *q, *qq, ch[20], *t, b, K, prs;
    FastIO()
        : p(in)
        , pp(in)
        , q(out)
        , qq(out + IOSIZE)
        , t(ch)
        , b(1)
        , K(6)
    {
    }
    ~FastIO()
    {
        flush();
    }
    void flush()
    {
        fwrite(out, 1, q - out, stdout);
        q = out;
    }
    inline char getch()
    {
        return p == pp && (pp = (p = in) + fread(in, 1, IOSIZE, stdin), p == pp) ? b = 0, EOF : *p++;
    }
    inline void putch(char x)
    {
        q == qq && (fwrite(out, 1, q - out, stdout), q = out), *q++ = x;
    }
    inline void puts(const char str[])
    {
        fwrite(out, 1, q - out, stdout), fwrite(str, 1, strlen(str), stdout), q = out;
    }
    inline void getline(std::string& s)
    {
        s = "";
        for (char ch; (ch = getch()) != '\n' && b;)
            s += ch;
    }
#define indef(T)                                               \
    inline FastIO& operator>>(T& x)                            \
    {                                                          \
        x = 0;                                                 \
        char f = 0, ch;                                        \
        while (!isdigit(ch = getch()) && b)                    \
            f |= ch == '-';                                    \
        while (isdigit(ch))                                    \
            x = (x << 1) + (x << 3) + (ch ^ 48), ch = getch(); \
        return x = f ? -x : x, *this;                          \
    }
    indef(int) indef(long long) inline FastIO& operator>>(char& ch)
    {
        return ch = getch(), *this;
    }
    inline FastIO& operator>>(std::string& s)
    {
        s = "";
        char ch;
        while (isspace(ch = getch()) && b)
            ;
        while (!isspace(ch) && b)
            s += ch, ch = getch();
        return *this;
    }
    inline FastIO& operator>>(double& x)
    {
        x = 0;
        char f = 0, ch;
        double d = 0.1;
        while (!isdigit(ch = getch()) && b)
            f |= (ch == '-');
        while (isdigit(ch))
            x = x * 10 + (ch ^ 48), ch = getch();
        if (ch == '.')
            while (isdigit(ch = getch()))
                x += d * (ch ^ 48), d *= 0.1;
        return x = f ? -x : x, *this;
    }
#define outdef(_T)                                            \
    inline FastIO& operator<<(_T x)                           \
    {                                                         \
        !x && (putch('0'), 0), x < 0 && (putch('-'), x = -x); \
        while (x)                                             \
            *t++ = x % 10 + 48, x /= 10;                      \
        while (t != ch)                                       \
            putch(*--t);                                      \
        return *this;                                         \
    }
    outdef(int) outdef(long long) inline FastIO& operator<<(char ch)
    {
        return putch(ch), *this;
    }
    inline FastIO& operator<<(const char str[])
    {
        return puts(str), *this;
    }
    inline FastIO& operator<<(const std::string& s)
    {
        return puts(s.c_str()), *this;
    }
    inline FastIO& operator<<(double x)
    {
        int k = 0;
        this->operator<<(int(x));
        putch('.');
        x -= int(x);
        prs && (x += 5 * pow(10, -K - 1));
        while (k < K)
            putch(int(x *= 10) ^ 48), x -= int(x), ++k;
        return *this;
    }
    inline FastIO& operator<<(const control& cl)
    {
        switch (cl.ct) {
        case 0:
            putch('\n');
            break;
        case 1:
            prs = cl.val;
            break;
        case 2:
            K = cl.val;
            break;
        }
        return *this;
    }
    inline operator bool()
    {
        return b;
    }
} io;
#define cin io
#define cout io
// 用并查集先预处理
const int MAX = 1e5 + 10;
int n, m, k;
int u, v;
int f[MAX];
int sz[MAX];
bool sd[MAX];
int e;
int im[MAX], o[MAX];
int ans;
vector<int> r[MAX];
int ff(int lc)
{
    return f[lc] = f[lc] == lc ? lc : ff(f[lc]);
}
inline void gether(int x, int y)
{
    if (ff(x) != ff(y))
    {
        if (sz[ff(x)] > sz[ff(y)])
        {
            sz[ff(x)] += sz[ff(y)];
            // sz[ff(y)] = 0;
            f[ff(y)] = ff(x);
        }
        else
        {
            sz[ff(y)] += sz[ff(x)];
            // sz[ff(y)] = 0;
            f[ff(x)] = ff(y);
        }
    }
}
bool s(int lc, int from, int rv)
{
    if (lc == e)
    {
        cout << lc << ' ';
        return 1;
    }
    if (rv == 0)
        return 0;
    for (int i = 0; i < r[lc].size(); i++)
    {
        if (r[lc][i] == from)
            continue;
        if (s(r[lc][i], lc, rv - 1))
        {
            cout << lc << ' ';
            return 1;
        }
    }
    return 0;
}
// #define test
int main()
{
    // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#ifdef test
    freopen("/home/hp/桌面/problems/contest/noip2025模拟赛/2025.10.26/down/data/travel/travel3/travel1.in", "r", stdin);
#else
    freopen("travel.in", "r", stdin);
    freopen("travel.out", "w", stdout);
#endif
    cin >> n >> m >> k;
    if (k <= 1)
    {
        cout << 0;
        return 0;
    }
    for (int i = 0; i < MAX; i++)
        f[i] = i, sz[i] = 1;
    for (int i = 0; i < m; i++)
        cin >> u >> v, r[u].emplace_back(v), r[v].emplace_back(u), gether(u, v);
    for (int i = 0; i < k; i++)
    {
        cin >> im[i];
        if (!o[ff(im[i])])
            o[ff(im[i])] = im[i];
        else
            ans++;
    }
    cout << ans << '\n';
    for (int i = 0; i < k; i++)
    {
        if (o[ff(im[i])] != im[i])
        { // 未处理过
            e = o[ff(im[i])];
            s(im[i], im[i], sz[ff(i)]);
            cout << '\n';
        }
    }
}
